﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace HCMUS_SearchService_Group2
{
    /////////////////////////////////////////////////
    /// \brief Lớp dùng để lấy chuỗi AutoComplete.
    /// \author Trần Minh Nhật -   0912322.
    /// \details <h3>Cung cấp các phương thức giúp việc Search trở nên dễ dàng hơn</h3>
    ////////////////////////////////////////////////
    public class AutoCompleteHelper
    {
        public const int MAXSUGGEST = 5;
        private List<String> _resultList;

        public List<String> ResultList
        {
            get { return this._resultList; }
            set { this._resultList = value; }
        }

        public AutoCompleteHelper()
        {
            this.ResultList = new List<String>();
        }

        /////////////////////////////////////////////////
        /// \brief Hàm lấy gợi ý
        /// \param[in] String input.
        /// \returns List<String>.
        /// \details <h3>Giúp lấy những gợi ý từ chuỗi cho trước.</h3>
        /////////////////////////////////////////////////
        public List<String> GetSuggest(String input)
        {
            if (this.ResultList.Count != 0)
            {
                this.ResultList.Clear();
            }

            /// \see TranslateHelper.FormatInputString(Sring);
            String inputConverted = TranslateHelper.FormatInputString(input);

            /// \see FindServiceBaseInput(String, String, String, String, String);
            this.FindServiceBaseInput(inputConverted, String.Empty, String.Empty, String.Empty, String.Empty);
            return this.ResultList;
        }

        /////////////////////////////////////////////////
        /// \brief Hàm lấy các từ khóa gợi ý
        /// \param[in] String input.
        /// \param[in] String tenDichVu.
        /// \param[in] String tenDuong.
        /// \param[in] String tenPhuong.
        /// \param[in] String tenQuan
        /// \param[out] không
        /// returns không
        /// \details <h3>Giúp lấy những gợi ý từ chuỗi cho trước.</h3>
        /////////////////////////////////////////////////
        public void FindServiceBaseInput(String input, String tenDichVu, String tenDuong, String tenPhuong, String tenQuan)
        {
            input = input.Trim();

            /// - Bước 1: Kiểm tra số lượng các gợi ý đã đủ chưa
            if (this.ResultList.Count == MAXSUGGEST)
            {
                return;
            }

            /// - Bước 2: Nếu input là rỗng tức là chuỗi cần xét đã hết. Thêm chuỗi có chứa kết quả vào Danh Sách. Dừng đệ quy
            if (input.Length == 0)
            {
                String result = String.Empty;
                if (tenDichVu != String.Empty)
                {
                    result += tenDichVu + " ";
                }

                if (tenDuong != String.Empty)
                {
                    result += String.Format("{0} ", tenDuong);
                }

                if (tenPhuong != String.Empty)
                {
                    result += String.Format("{0} ", tenPhuong);
                }

                if (tenQuan != String.Empty)
                {
                    result += String.Format("Q.{0}", tenQuan);
                }
                result.Trim();              
                Boolean isExist = false ;
                for (int i = 0; i < ResultList.Count; i++)
                {
                    if (ResultList[i] == result)
                    {
                        isExist = true;
                        break;
                    }
                }

                if (!isExist)
                {
                    this.ResultList.Add(result);
                }
                else
                {
                    return;
                }
            }

            if (this.ResultList.Count == MAXSUGGEST)
            {
                return;
            }
            /// - Bước 3: Tìm Tên Dịch vụ phù hợp
            if (tenDichVu == String.Empty)
            {
                /// \see SearchHelper.GetListItem(int,string);
                List<String> listService = SearchHelper.GetListItem(SearchHelper.SERVICE, input);
                for (int i = 0; i < listService.Count; i++)
                {
                    if (listService[i].Length == 0)
                    {
                        continue;
                    }
                    /// \see TranslateHelper.FormatInputString(string);
                    String tempService = TranslateHelper.FormatInputString(listService[i]);
                    if (tempService.StartsWith(input))
                    {
                        /// \see FindServiceBaseInput(string,string,string,string,string);
                        this.FindServiceBaseInput(String.Empty, listService[i], tenDuong, tenPhuong, tenQuan);
                    }
                    else
                    {
                        /// \see FindServiceBaseInput(string,string,string,string,string);
                        this.FindServiceBaseInput(input.Replace(tempService, String.Empty), listService[i], tenDuong, tenPhuong, tenQuan);
                    }

                }
            }

            /// - Bước 4: Tìm Tên Quận/Huyện phù hợp
            if (this.ResultList.Count == MAXSUGGEST)
            {
                return;
            }

            if (tenQuan == String.Empty)
            {
                /// \see SearchHelper.GetListItem(int,string);
                List<String> listDistrict = SearchHelper.GetListItem(SearchHelper.DISTRICT, input);
                for (int i = 0; i < listDistrict.Count; i++)
                {
                    if (listDistrict[i].Length == 0)
                    {
                        continue;
                    }
                    /// \see TranslateHelper.FormatInputString(string);
                    String tempDistrict = TranslateHelper.FormatInputString(listDistrict[i]);
                    if (tempDistrict.StartsWith(input))
                    {
                        /// \see FindServiceBaseInput(string,string,string,string,string);
                        this.FindServiceBaseInput(String.Empty, tenDichVu, tenDuong, tenPhuong, listDistrict[i]);
                    }
                    else
                    {
                        /// \see FindServiceBaseInput(string,string,string,string,string);
                        this.FindServiceBaseInput(input.Replace(tempDistrict, String.Empty), tenDichVu, tenDuong, tenPhuong, listDistrict[i]);
                    }
                }
            }
            /// - Bước 5: Tìm Tên Đường phù hợp
            
            if (this.ResultList.Count == MAXSUGGEST)
            {
                return;
            }
            if (tenDuong == String.Empty)
            {
                /// \see SearchHelper.GetListItem(int,string);
                List<String> listStreet = SearchHelper.GetListItem(SearchHelper.STREET, input);
                for (int i = 0; i < listStreet.Count; i++)
                {
                    if (listStreet[i].Length == 0)
                    {
                        continue;
                    }
                    String tempStreet = TranslateHelper.FormatInputString(listStreet[i]);
                    if (tempStreet.StartsWith(input))
                    {
                        /// \see FindServiceBaseInput(string,string,string,string,string);
                        this.FindServiceBaseInput(String.Empty, tenDichVu, listStreet[i], tenPhuong, tenQuan);
                    }
                    else
                    {
                        /// \see FindServiceBaseInput(string,string,string,string,string);
                        this.FindServiceBaseInput(input.Replace(tempStreet, String.Empty), listStreet[i], tenDuong, tenPhuong, tenQuan);
                    }
                }
            }
            /// - Bước 6: Tìm Tên Phường phù hợp
            

            if (this.ResultList.Count == MAXSUGGEST)
            {
                return;
            }
            
            if (tenPhuong == String.Empty)
            {
                /// \see SearchHelper.GetListItem(int,string);
                List<String> listWard = SearchHelper.GetListItem(SearchHelper.WARD, input);
                for (int i = 0; i < listWard.Count; i++)
                {
                    if (listWard[i].Length == 0)
                    {
                        continue;
                    }
                    /// \see TranslateHelper.FormatInputString(string);
                    String tempWard = TranslateHelper.FormatInputString(listWard[i]);
                    if (tempWard.StartsWith(input))
                    {
                        /// \see FindServiceBaseInput(string,string,string,string,string);
                        this.FindServiceBaseInput(String.Empty, tenDichVu, tenDuong, tenPhuong, tenQuan);
                    }
                    else
                    {
                        /// \see FindServiceBaseInput(string,string,string,string,string);
                        this.FindServiceBaseInput(input.Replace(tempWard, String.Empty), tenDichVu, tenDuong, listWard[i], tenQuan);
                    }
                }
            }

        }
    }
}
